<!DOCTYPE html>
<html lang="en" dir="ltr" class="client-nojs">
<head>
<title>Declarations - cppreference.com</title>
<meta charset="UTF-8">
<meta name="generator" content="MediaWiki 1.21.2">
<link rel="shortcut icon" href="../../../common/favicon.ico">
<link rel="stylesheet" href="../../../common/ext.css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" href="../../../common/site_modules.css">
<style>a:lang(ar),a:lang(ckb),a:lang(fa),a:lang(kk-arab),a:lang(mzn),a:lang(ps),a:lang(ur){text-decoration:none}#toc{display:none}.editsection{display:none}
/* cache key: mwiki1-mwiki_en_:resourceloader:filter:minify-css:7:472787eddcf4605d11de8c7ef047234f */</style>

<script src="../../../common/startup_scripts.js"></script>
<script>if(window.mw){
mw.config.set({"wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"c/language/declarations","wgTitle":"c/language/declarations","wgCurRevisionId":130617,"wgArticleId":13948,"wgIsArticle":true,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":[],"wgBreakFrames":false,"wgPageContentLanguage":"en","wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgDefaultDateFormat":"dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgMonthNamesShort":["","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"wgRelevantPageName":"c/language/declarations","wgRestrictionEdit":[],"wgRestrictionMove":[]});
}</script><script>if(window.mw){
mw.loader.implement("user.options",function(){mw.user.options.set({"ccmeonemails":0,"cols":80,"date":"default","diffonly":0,"disablemail":0,"disablesuggest":0,"editfont":"default","editondblclick":0,"editsection":0,"editsectiononrightclick":0,"enotifminoredits":0,"enotifrevealaddr":0,"enotifusertalkpages":1,"enotifwatchlistpages":0,"extendwatchlist":0,"externaldiff":0,"externaleditor":0,"fancysig":0,"forceeditsummary":0,"gender":"unknown","hideminor":0,"hidepatrolled":0,"imagesize":2,"justify":0,"math":1,"minordefault":0,"newpageshidepatrolled":0,"nocache":0,"noconvertlink":0,"norollbackdiff":0,"numberheadings":0,"previewonfirst":0,"previewontop":1,"quickbar":5,"rcdays":7,"rclimit":50,"rememberpassword":0,"rows":25,"searchlimit":20,"showhiddencats":0,"showjumplinks":1,"shownumberswatching":1,"showtoc":0,"showtoolbar":1,"skin":"cppreference2","stubthreshold":0,"thumbsize":2,"underline":2,"uselivepreview":0,"usenewrc":0,"watchcreations":0,"watchdefault":0,"watchdeletion":0,
"watchlistdays":3,"watchlisthideanons":0,"watchlisthidebots":0,"watchlisthideliu":0,"watchlisthideminor":0,"watchlisthideown":0,"watchlisthidepatrolled":0,"watchmoves":0,"wllimit":250,"variant":"en","language":"en","searchNs0":true,"searchNs1":false,"searchNs2":false,"searchNs3":false,"searchNs4":false,"searchNs5":false,"searchNs6":false,"searchNs7":false,"searchNs8":false,"searchNs9":false,"searchNs10":false,"searchNs11":false,"searchNs12":false,"searchNs13":false,"searchNs14":false,"searchNs15":false,"gadget-ColiruCompiler":1,"gadget-MathJax":1});;},{},{});mw.loader.implement("user.tokens",function(){mw.user.tokens.set({"editToken":"+\\","patrolToken":false,"watchToken":false});;},{},{});
/* cache key: mwiki1-mwiki_en_:resourceloader:filter:minify-js:7:9f05c6caceb9bb1a482b6cebd4c5a330 */
}</script>
<script>if(window.mw){
mw.loader.load(["mediawiki.page.startup","mediawiki.legacy.wikibits","mediawiki.legacy.ajax"]);
}</script>
<style type="text/css">/*<![CDATA[*/
.source-c {line-height: normal;}
.source-c li, .source-c pre {
	line-height: normal; border: 0px none white;
}
/**
 * GeSHi Dynamically Generated Stylesheet
 * --------------------------------------
 * Dynamically generated stylesheet for c
 * CSS class: source-c, CSS id: 
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 * --------------------------------------
 */
.c.source-c .de1, .c.source-c .de2 {font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;}
.c.source-c  {font-family:monospace;}
.c.source-c .imp {font-weight: bold; color: red;}
.c.source-c li, .c.source-c .li1 {font-weight: normal; vertical-align:top;}
.c.source-c .ln {width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;}
.c.source-c .li2 {font-weight: bold; vertical-align:top;}
.c.source-c .kw1 {color: #0000dd;}
.c.source-c .kw2 {color: #0000ff;}
.c.source-c .kw3 {color: #0000dd;}
.c.source-c .kw4 {color: #0000ff;}
.c.source-c .co1 {color: #909090;}
.c.source-c .co2 {color: #339900;}
.c.source-c .coMULTI {color: #ff0000; font-style: italic;}
.c.source-c .es0 {color: #008000; font-weight: bold;}
.c.source-c .es1 {color: #008000; font-weight: bold;}
.c.source-c .es2 {color: #008000; font-weight: bold;}
.c.source-c .es3 {color: #008000; font-weight: bold;}
.c.source-c .es4 {color: #008000; font-weight: bold;}
.c.source-c .es5 {color: #008000; font-weight: bold;}
.c.source-c .br0 {color: #008000;}
.c.source-c .sy0 {color: #008000;}
.c.source-c .sy1 {color: #000080;}
.c.source-c .sy2 {color: #000040;}
.c.source-c .sy3 {color: #000040;}
.c.source-c .sy4 {color: #008080;}
.c.source-c .st0 {color: #008000;}
.c.source-c .nu0 {color: #000080;}
.c.source-c .nu6 {color:#000080;}
.c.source-c .nu8 {color:#000080;}
.c.source-c .nu12 {color:#000080;}
.c.source-c .nu16 {color:#000080;}
.c.source-c .nu17 {color:#000080;}
.c.source-c .nu18 {color:#000080;}
.c.source-c .nu19 {color:#000080;}
.c.source-c .ln-xtra, .c.source-c li.ln-xtra, .c.source-c div.ln-xtra {background-color: #ffc;}
.c.source-c span.xtra { display:block; }

/*]]>*/
</style><!--[if lt IE 7]><style type="text/css">body{behavior:url("/mwiki/skins/cppreference2/csshover.min.htc")}</style><![endif]--></head>
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-c_language_declarations skin-cppreference2 action-view cpp-navbar">
        <!-- header -->
        <!-- /header -->
        <!-- content -->
<div id="cpp-content-base">
            <div id="content">
                <a id="top"></a>
                <div id="mw-js-message" style="display:none;"></div>
                                <!-- firstHeading -->
<h1 id="firstHeading" class="firstHeading">Declarations</h1>
                <!-- /firstHeading -->
                <!-- bodyContent -->
                <div id="bodyContent">
                                        <!-- tagline -->
                    <div id="siteSub">From cppreference.com</div>
                    <!-- /tagline -->
                                        <!-- subtitle -->
                    <div id="contentSub"><span class="subpages">&lt; <a href="../../c.html" title="c">c</a>‎ | <a href="../language.html" title="c/language">language</a></span></div>
                    <!-- /subtitle -->
                                                            <!-- bodycontent -->
                    <div id="mw-content-text" lang="en" dir="ltr" class="mw-content-ltr"><div class="t-navbar" style=""><div class="t-navbar-sep"> </div><div class="t-navbar-head"><a href="../../c.html" title="c"> C</a><div class="t-navbar-menu"><div><div><table class="t-nv-begin" cellpadding="0" style="line-height:1.1em;">
<tr class="t-nv"><td colspan="5"> <a href="../language.html" title="c/language"> Language</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../header.html" title="c/header"> Headers</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../types.html" title="c/types"> Type support</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../program.html" title="c/program"> Program utilities</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../variadic.html" title="c/variadic"> Variadic function support</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../error.html" title="c/error"> Error handling</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../memory.html" title="c/memory"> Dynamic memory management</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../string.html" title="c/string"> Strings library</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../algorithm.html" title="c/algorithm"> Algorithms</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../numeric.html" title="c/numeric"> Numerics</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../chrono.html" title="c/chrono"> Date and time utilities</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../io.html" title="c/io"> Input/output support</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../locale.html" title="c/locale"> Localization support</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../thread.html" title="c/thread"> Concurrency support</a> <span class="t-mark-rev t-since-c11">(C11)</span> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../experimental.html" title="c/experimental"> Technical Specifications</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../index.html" title="c/symbol index"> Symbol index</a> </td></tr>
</table></div><div></div></div></div></div><div class="t-navbar-sep"> </div><div class="t-navbar-head"><a href="../language.html" title="c/language"> C language</a><div class="t-navbar-menu"><div><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="basic_concepts.html" title="c/language/basic concepts">Basic concepts</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../keyword.html" title="c/keyword"> Keywords</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../preprocessor.html" title="c/preprocessor"> Preprocessor</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="statements.html" title="c/language/statements"> Statements</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="expressions.html" title="c/language/expressions"> Expressions</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="initialization.html" title="c/language/initialization"> Initialization</a></td></tr>
<tr class="t-nv"><td colspan="5"> <strong class="selflink"> Declarations</strong></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="functions.html" title="c/language/functions"> Functions</a></td></tr>
<tr class="t-nv-h2"><td colspan="5"> Miscellaneous</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="history.html" title="c/language/history"> History of C</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../experimental.html" title="c/experimental">Technical Specifications</a> </td></tr>
</table></div><div></div></div></div></div><div class="t-navbar-sep"> </div><div class="t-navbar-head"><strong class="selflink"> Declarations</strong><div class="t-navbar-menu"><div><div style="display:inline-block">
<div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="pointer.html" title="c/language/pointer"> pointer</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="array.html" title="c/language/array"> array</a> </td></tr>
<tr class="t-nv"><td colspan="5"><div class="t-nv-ln-table"><div><a href="enum.html" title="c/language/enum"><span class="t-lines"><span>enum</span></span></a></div></div></td></tr>
<tr class="t-nv"><td colspan="5"><div class="t-nv-ln-table"><div><a href="struct.html" title="c/language/struct"><span class="t-lines"><span>struct</span></span></a></div></div></td></tr>
<tr class="t-nv"><td colspan="5"><div class="t-nv-ln-table"><div><a href="union.html" title="c/language/union"><span class="t-lines"><span>union</span></span></a></div></div></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="bit_field.html" title="c/language/bit field"> bit field</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="atomic.html" title="c/language/atomic"> atomic types</a> <span class="t-mark-rev t-since-c11">(C11)</span></td></tr>
<tr class="t-nv"><td colspan="5"><div class="t-nv-ln-table"><div><a href="const.html" title="c/language/const"><span class="t-lines"><span>const</span></span></a></div></div></td></tr>
<tr class="t-nv"><td colspan="5"><div class="t-nv-ln-table"><div><a href="volatile.html" title="c/language/volatile"><span class="t-lines"><span>volatile</span></span></a></div></div></td></tr>
<tr class="t-nv"><td colspan="5"><div class="t-nv-ln-table"><div><a href="restrict.html" title="c/language/restrict"><span class="t-lines"><span>restrict</span></span></a></div><div><span class="t-lines"><span><span class="t-mark-rev t-since-c99">(C99)</span></span></span></div></div></td></tr>
<tr class="t-nv"><td colspan="5"><div class="t-nv-ln-table"><div><a href="_Alignas.html" title="c/language/ Alignas"><span class="t-lines"><span>_Alignas</span></span></a></div><div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div></div></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="storage_duration.html" title="c/language/storage duration"> storage duration and linkage</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="extern.html" title="c/language/extern"> external and tentative definitions</a> </td></tr>
<tr class="t-nv"><td colspan="5"><div class="t-nv-ln-table"><div><a href="typedef.html" title="c/language/typedef"><span class="t-lines"><span>typedef</span></span></a></div></div></td></tr>
<tr class="t-nv"><td colspan="5"><div class="t-nv-ln-table"><div><a href="static_assert.html" title="c/language/ Static assert"><span class="t-lines"><span>_Static_assert</span></span></a></div><div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div></div></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="attributes.html" title="c/language/attributes"> attributes</a> <span class="t-mark-rev t-since-c23">(C23)</span></td></tr>
</table></div>
</div><div></div></div></div></div><div class="t-navbar-sep"> </div></div>
<p>A <i>declaration</i> is a C language construct that introduces one or more  <a href="identifier.html" title="c/language/identifier">identifiers</a> into the program and specifies their meaning and properties.
</p><p>Declarations may appear in any scope. Each declaration ends with a semicolon (just like <a href="statements.html" title="c/language/statements">a statement</a>) and consists of <span class="t-rev-inl t-until-c23"><span>two</span> <span><span class="t-mark-rev t-until-c23">(until C23)</span></span></span><span class="t-rev-inl t-since-c23"><span>three</span> <span><span class="t-mark-rev t-since-c23">(since C23)</span></span></span> distinct parts:
</p>
<table class="t-sdsc-begin">

<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr>
<tr class="t-sdsc">
<td> <span class="t-spar">specifiers-and-qualifiers</span> <span class="t-spar">declarators-and-initializers</span><span class="t-mark">(optional)</span> <code><b>;</b></code>
</td>
<td> (1)
</td>
<td class="t-sdsc-nopad">
</td></tr>



<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr>
<tr class="t-sdsc">
<td> <span class="t-spar">attr-spec-seq</span> <span class="t-spar">specifiers-and-qualifiers</span> <span class="t-spar">declarators-and-initializers</span> <code><b>;</b></code>
</td>
<td> (2)
</td>
<td> <span class="t-mark-rev t-since-c23">(since C23)</span>
</td></tr>



<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr>
<tr class="t-sdsc">
<td> <span class="t-spar">attr-spec-seq</span> <code><b>;</b></code>
</td>
<td> (3)
</td>
<td> <span class="t-mark-rev t-since-c23">(since C23)</span>
</td></tr>



<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr></table>
<p>where
</p>
<table class="t-par-begin">


<tr class="t-par">
<td> <span class="t-spar">specifiers-and-qualifiers</span>
</td>
<td> -
</td>
<td>  whitespace-separated list of, in any order,
<ul><li> type specifiers:
</li></ul>
<dl><dd><ul><li> <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">void</span></span></span>
</li><li> the name of an <a href="arithmetic_types.html" title="c/language/arithmetic types">arithmetic type</a>
</li><li> the name of an <a href="atomic.html" title="c/language/atomic">atomic type</a>
</li><li> a name earlier introduced by a <a href="typedef.html" title="c/language/typedef">typedef</a> declaration
</li><li> <a href="struct.html" title="c/language/struct"><code>struct</code></a>, <a href="union.html" title="c/language/union"><code>union</code></a>, or <a href="enum.html" title="c/language/enum"><code>enum</code></a> specifier
</li></ul>
</dd></dl>
<ul><li> zero or one storage-class specifiers: <a href="typedef.html" title="c/language/typedef"><code>typedef</code></a>, <a href="storage_duration.html" title="c/language/storage duration"><code>auto</code>, <code>register</code>, <code>static</code>, <code>extern</code>, <code>_Thread_local</code></a>
</li><li> zero or more type qualifiers: <a href="const.html" title="c/language/const"><code>const</code></a>, <a href="volatile.html" title="c/language/volatile"><code>volatile</code></a>, <a href="restrict.html" title="c/language/restrict"><code>restrict</code></a>, <a href="atomic.html" title="c/language/atomic"><code>_Atomic</code></a>
</li><li> (only when declaring functions), zero or more function specifiers: <a href="inline.html" title="c/language/inline"><code>inline</code></a>, <a href="_Noreturn.html" title="c/language/ Noreturn"><code>_Noreturn</code></a>
</li><li> zero or more alignment specifiers: <a href="_Alignas.html" title="c/language/ Alignas"><code>_Alignas</code></a>
</li></ul>
</td></tr>
<tr class="t-par">
<td> <span class="t-spar">declarators-and-initializers</span>
</td>
<td> -
</td>
<td>  comma-separated list of <span class="t-spar">declarators</span> (each declarator provides additional type information and/or the identifier to declare). Declarators may be accompanied by <a href="initialization.html" title="c/language/initialization">initializers</a>. The <a href="enum.html" title="c/language/enum">enum</a>, <a href="struct.html" title="c/language/struct">struct</a>, and <a href="union.html" title="c/language/union">union</a> declarations may omit <span class="t-spar">declarators</span>, in which case they only introduce the enumeration constants and/or tags.
</td></tr>
<tr class="t-par">
<td> <span class="t-spar">attr-spec-seq</span>
</td>
<td> -
</td>
<td>  <span class="t-mark-rev t-since-c23">(C23)</span>optional list of <a href="attributes.html" title="c/language/attributes">attributes</a>, applied to the declared entities, or forms an attribute declaration if appears alone.
</td></tr></table>
<div class="t-li1"><span class="t-li">1-2)</span> Simple declaration. Introduces one or more identifiers which denotes objects, functions, struct/union/enum tags, typedefs, or enumeration constants.</div>
<div class="t-li1"><span class="t-li">3)</span> Attribute declaration. Does not declares any identifier, and has implementation-defined meaning if the meaning is not specified by the standard.</div>
<p>For example,
</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="c source-c"><pre class="de1"><span class="kw4">int</span> a, <span class="sy2">*</span>b<span class="sy1">=</span><a href="../types/NULL.html"><span class="kw103">NULL</span></a><span class="sy4">;</span> <span class="co1">// "int" is the type specifier,</span>
                <span class="co1">// "a" is a declarator</span>
                <span class="co1">// "*b" is a declarator and NULL is its initializer</span>
<span class="kw4">const</span> <span class="kw4">int</span> <span class="sy2">*</span>f<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// "int" is the type specifier</span>
                    <span class="co1">// "const" is the type qualifier</span>
                    <span class="co1">// "*f(void)" is the declarator</span>
<span class="kw2">enum</span> COLOR <span class="br0">{</span>RED, GREEN, BLUE<span class="br0">}</span> c<span class="sy4">;</span> <span class="co1">// "enum COLOR {RED, GREEN, BLUE}" is the type specifier</span>
                                 <span class="co1">// "c" is the declarator</span></pre></div></div>
<p>The type of each identifier introduced in a declaration is determined by a combination of the type specified by the <span class="t-spar">type specifier</span> and the type modifications applied by its <span class="t-spar">declarator</span>.
</p><p><a href="attributes.html" title="c/language/attributes">Attributes</a><span class="t-mark-rev t-since-c23">(since C23)</span> may appear in <span class="t-spar">specifiers-and-qualifiers</span>, in which case they apply to the type determined by the preceding specifiers.
</p>
<h3><span class="mw-headline" id="Declarators">Declarators</span></h3>
<p>Each declarator is one of the following:
</p>
<table class="t-sdsc-begin">

<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr>
<tr class="t-sdsc">
<td> <span class="t-spar">identifier</span> <span class="t-spar">attr-spec-seq</span><span class="t-mark">(optional)</span>
</td>
<td> (1)
</td>
<td class="t-sdsc-nopad">
</td></tr>



<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr>
<tr class="t-sdsc">
<td> <code><b>(</b></code> <span class="t-spar">declarator</span> <code><b>)</b></code>
</td>
<td> (2)
</td>
<td class="t-sdsc-nopad">
</td></tr>



<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr>
<tr class="t-sdsc">
<td> <code><b>*</b></code> <span class="t-spar">attr-spec-seq</span><span class="t-mark">(optional)</span> <span class="t-spar">qualifiers</span><span class="t-mark">(optional)</span> <span class="t-spar">declarator</span>
</td>
<td> (3)
</td>
<td class="t-sdsc-nopad">
</td></tr>



<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr>
<tr class="t-sdsc">
<td> <span class="t-spar">noptr-declarator</span> <code><b>[</b></code> <code><b>static</b></code><span class="t-mark">(optional)</span> <span class="t-spar">qualifiers</span><span class="t-mark">(optional)</span> <span class="t-spar">expression</span> <code><b>]</b></code>
<p><span class="t-spar">noptr-declarator</span> <code><b>[</b></code> <span class="t-spar">qualifiers</span><span class="t-mark">(optional)</span> <code><b>*</b></code> <code><b>]</b></code>
</p>
</td>
<td> (4)
</td>
<td class="t-sdsc-nopad">
</td></tr>



<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr>
<tr class="t-sdsc">
<td> <span class="t-spar">noptr-declarator</span> <code><b>(</b></code> <span class="t-spar">parameters-or-identifiers</span> <code><b>)</b></code>
</td>
<td> (5)
</td>
<td class="t-sdsc-nopad">
</td></tr>



<tr>
<td colspan="10" class="t-sdsc-sep">
</td></tr></table>
<div class="t-li1"><span class="t-li">1)</span> the identifier that this declarator introduces.</div>
<div class="t-li1"><span class="t-li">2)</span> any declarator may be enclosed in parentheses; this is required to introduce pointers to arrays and pointers to functions.</div>
<div class="t-li1"><span class="t-li">3)</span> <a href="pointer.html" title="c/language/pointer">pointer declarator</a>: the declaration <span class="t-c"><span class="mw-geshi c source-c">S <span class="sy2">*</span> cvr D</span></span>; declares <code>D</code> as a <span class="t-spar">cvr</span>-qualified pointer to the type determined by <code>S</code>.</div>
<div class="t-li1"><span class="t-li">4)</span> <a href="array.html" title="c/language/array">array declarator</a>: the declaration <span class="t-c"><span class="mw-geshi c source-c">S D<span class="br0">[</span>N<span class="br0">]</span></span></span> declares <code>D</code> as an array of <code>N</code> objects of the type determined by <code>S</code>. <span class="t-spar">noptr-declarator</span> is any other declarator except unparenthesized pointer declarator.</div>
<div class="t-li1"><span class="t-li">5)</span> <a href="function_declaration.html" title="c/language/function declaration">function declarator</a>: the declaration <span class="t-c"><span class="mw-geshi c source-c">S D<span class="br0">(</span>params<span class="br0">)</span></span></span> declared <code>D</code> as a function taking the parameters <code>params</code> and returning <code>S</code>. <span class="t-spar">noptr-declarator</span> is any other declarator except unparenthesized pointer declarator.</div>
<p>The reasoning behind this syntax is that when the identifier declared by the declarator appears in an expression of the same form as the declarator, it would have the type specified by the type specifier sequence.
</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="c source-c"><pre class="de1"><span class="kw1">struct</span> C <span class="br0">{</span>
    <span class="kw4">int</span> member<span class="sy4">;</span> <span class="co1">// "int" is the type specifier </span>
                <span class="co1">// "member" is the declarator</span>
<span class="br0">}</span> obj, <span class="sy2">*</span>pObj <span class="sy1">=</span> <span class="sy3">&amp;</span>obj<span class="sy4">;</span>
<span class="co1">// "struct C { int member; }" is the type specifier</span>
<span class="co1">// declarator "obj" defines an object of type struct C</span>
<span class="co1">// declarator "*pObj" declares a pointer to C,</span>
<span class="co1">// initializer "= &amp;obj" provides the initial value for that pointer</span>
 
<span class="kw4">int</span> a <span class="sy1">=</span> <span class="nu0">1</span>, <span class="sy2">*</span>p <span class="sy1">=</span> <a href="../types/NULL.html"><span class="kw103">NULL</span></a>, f<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span>, <span class="br0">(</span><span class="sy2">*</span>pf<span class="br0">)</span><span class="br0">(</span><span class="kw4">double</span><span class="br0">)</span><span class="sy4">;</span>
<span class="co1">// the type specifier is "int"</span>
<span class="co1">// declarator "a" defines an object of type int</span>
<span class="co1">//   initializer "=1" provides its initial value</span>
<span class="co1">// declarator "*p" defines an object of type pointer to int</span>
<span class="co1">//   initializer "=NULL" provides its initial value</span>
<span class="co1">// declarator "f(void)" declares a function taking void and returning int</span>
<span class="co1">// declarator "(*pf)(double)" defines an object of type pointer</span>
<span class="co1">//   to function taking double and returning int</span>
 
<span class="kw4">int</span> <span class="br0">(</span><span class="sy2">*</span><span class="br0">(</span><span class="sy2">*</span>foo<span class="br0">)</span><span class="br0">(</span><span class="kw4">double</span><span class="br0">)</span><span class="br0">)</span><span class="br0">[</span><span class="nu0">3</span><span class="br0">]</span> <span class="sy1">=</span> <a href="../types/NULL.html"><span class="kw103">NULL</span></a><span class="sy4">;</span>
<span class="co1">// the type specifier is int</span>
<span class="co1">// 1. declarator "(*(*foo)(double))[3]" is an array declarator:</span>
<span class="co1">//    the type declared is "/nested declarator/ array of 3 int"</span>
<span class="co1">// 2. the nested declarator is "*(*foo)(double))", which is a pointer declarator</span>
<span class="co1">//    the type declared is "/nested declarator/ pointer to array of 3 int"</span>
<span class="co1">// 3. the nested declarator is "(*foo)(double)", which is a function declarator</span>
<span class="co1">//    the type declared is "/nested declarator/ function taking double and returning</span>
<span class="co1">//        pointer to array of 3 int"</span>
<span class="co1">// 4. the nested declarator is "(*foo)" which is a (parenthesized, as required by</span>
<span class="co1">//        function declarator syntax) pointer declarator.</span>
<span class="co1">//    the type declared is "/nested declarator/ pointer to function taking double</span>
<span class="co1">//        and returning pointer to array of 3 int"</span>
<span class="co1">// 5. the nested declarator is "foo", which is an identifier.</span>
<span class="co1">// The declaration introduces the identifier "foo" to refer to an object of type</span>
<span class="co1">// "pointer to function taking double and returning pointer to array of 3 int"</span>
<span class="co1">// The initializer "= NULL" provides the initial value of this pointer.</span>
 
<span class="co1">// If "foo" is used in an expression of the form of the declarator, its type would be</span>
<span class="co1">// int.</span>
<span class="kw4">int</span> x <span class="sy1">=</span> <span class="br0">(</span><span class="sy2">*</span><span class="br0">(</span><span class="sy2">*</span>foo<span class="br0">)</span><span class="br0">(</span><span class="nu16">1.2</span><span class="br0">)</span><span class="br0">)</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span><span class="sy4">;</span></pre></div></div>
<p>The end of every declarator that is not part of another declarator is a <a href="eval_order.html" title="c/language/eval order">sequence point</a>.
</p><p>In all cases, <span class="t-spar">attr-spec-seq</span> is an optional sequence of <a href="attributes.html" title="c/language/attributes">attributes</a><span class="t-mark-rev t-since-c23">(since C23)</span>. When appearing immediately after the identifier, it applies to the object or function being declared.
</p>
<h3><span class="mw-headline" id="Definitions">Definitions</span></h3>
<p>A <i>definition</i> is a declaration that provides all information about the identifiers it declares.
</p><p>Every declaration of an <a href="enum.html" title="c/language/enum">enum</a> or a <a href="typedef.html" title="c/language/typedef">typedef</a> is a definition.
</p><p>For functions, a declaration that includes the function body is a <a href="function_definition.html" title="c/language/function definition">function definition</a>:
</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="c source-c"><pre class="de1"><span class="kw4">int</span> foo<span class="br0">(</span><span class="kw4">double</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// declaration</span>
<span class="kw4">int</span> foo<span class="br0">(</span><span class="kw4">double</span> x<span class="br0">)</span><span class="br0">{</span> <span class="kw1">return</span> x<span class="sy4">;</span> <span class="br0">}</span> <span class="co1">// definition</span></pre></div></div>
<p>For objects, a declaration that allocates storage (<a href="storage_duration.html" title="c/language/storage duration">automatic or static</a>, but not extern) is a definition, while a declaration that does not allocate storage (<a href="extern.html" title="c/language/extern">external declaration</a>) is not.
</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="c source-c"><pre class="de1"><span class="kw2">extern</span> <span class="kw4">int</span> n<span class="sy4">;</span> <span class="co1">// declaration</span>
<span class="kw4">int</span> n <span class="sy1">=</span> <span class="nu0">10</span><span class="sy4">;</span> <span class="co1">// definition</span></pre></div></div>
<p>For <a href="struct.html" title="c/language/struct">structs</a> and <a href="union.html" title="c/language/union">unions</a>, declarations that specify the list of members are definitions:
</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="c source-c"><pre class="de1"><span class="kw1">struct</span> X<span class="sy4">;</span> <span class="co1">// declaration</span>
<span class="kw1">struct</span> X <span class="br0">{</span> <span class="kw4">int</span> n<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// definition</span></pre></div></div>
<h3><span class="mw-headline" id="Redeclaration">Redeclaration</span></h3>
<p>A declaration cannot introduce an identifier if another declaration for the same identifier in the same <a href="scope.html" title="c/language/scope">scope</a> appears earlier, except that
</p>
<ul><li> Declarations of objects <a href="storage_duration.html" title="c/language/storage duration">with linkage</a> (external or internal) can be repeated:
</li></ul>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="c source-c"><pre class="de1"><span class="kw2">extern</span> <span class="kw4">int</span> x<span class="sy4">;</span>
<span class="kw4">int</span> x <span class="sy1">=</span> <span class="nu0">10</span><span class="sy4">;</span> <span class="co1">// OK</span>
<span class="kw2">extern</span> <span class="kw4">int</span> x<span class="sy4">;</span> <span class="co1">// OK</span>
 
<span class="kw4">static</span> <span class="kw4">int</span> n<span class="sy4">;</span>
<span class="kw4">static</span> <span class="kw4">int</span> n <span class="sy1">=</span> <span class="nu0">10</span><span class="sy4">;</span> <span class="co1">// OK</span>
<span class="kw4">static</span> <span class="kw4">int</span> n<span class="sy4">;</span> <span class="co1">// OK</span></pre></div></div>
<ul><li> Non-VLA <a href="typedef.html" title="c/language/typedef">typedef</a> can be repeated as long as it names the same type:
</li></ul>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="c source-c"><pre class="de1"><span class="kw1">typedef</span> <span class="kw4">int</span> int_t<span class="sy4">;</span> 
<span class="kw1">typedef</span> <span class="kw4">int</span> int_t<span class="sy4">;</span> <span class="co1">// OK</span></pre></div></div>
<ul><li> <a href="struct.html" title="c/language/struct">struct</a> and <a href="union.html" title="c/language/union">union</a> declarations can be repeated:
</li></ul>
<div dir="ltr" class="mw-geshi" style="text-align: left;"><div class="c source-c"><pre class="de1"><span class="kw1">struct</span> X<span class="sy4">;</span>
<span class="kw1">struct</span> X <span class="br0">{</span> <span class="kw4">int</span> n<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">struct</span> X<span class="sy4">;</span></pre></div></div>
<p>These rules simplify the use of header files.
</p>
<h3><span class="mw-headline" id="Notes">Notes</span></h3>
 <table class="t-rev-begin">
<tr class="t-rev t-until-c99"><td>
<p>In C89, declarations within any <a href="statements.html#Compound_statements" title="c/language/statements">compound statement</a> (block scope) must appear in the beginning of the block, before any <a href="statements.html" title="c/language/statements">statements</a>.
</p><p>Also, in C89, functions returning <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">int</span></span></span> may be implicitly declared by the <a href="operator_other.html#Function_call" title="c/language/operator other">function call operator</a> and function parameters of type <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">int</span></span></span> do not have to be declared when using old-style <a href="function_definition.html" title="c/language/function definition">function definitions</a>.
</p>
</td>
<td><span class="t-mark-rev t-until-c99">(until C99)</span></td></tr>
</table>
<p>Empty declarators are prohibited; a simple declaration must have at least one declarator or declare at least one struct/union/enum tag, or introduce at least one enumeration constant.
</p>
 <table class="t-rev-begin">
<tr class="t-rev t-since-c99"><td>
<p>If any part of a declarator is a <a href="array.html" title="c/language/array">variable-length array</a> (VLA) declarator, the entire declarator's type is known as "variably-modified type". Types defined from variably-modified types are also variably modified (VM).
</p><p>Declarations of any variably-modified types may appear only at <a href="scope.html" title="c/language/scope">block scope</a> or function prototype scope and cannot be members of structs or unions. Although VLA can only have automatic or allocated <a href="storage_duration.html" title="c/language/storage duration">storage duration</a>, a VM type such as a pointer to a VLA may be static. There are other restrictions on the use of VM types, see <a href="goto.html" title="c/language/goto">goto</a>, <a href="switch.html" title="c/language/switch">switch</a>. <span class="t-lc"><a href="../program/longjmp.html" title="c/program/longjmp">longjmp</a></span>
</p>
</td>
<td><span class="t-mark-rev t-since-c99">(since C99)</span></td></tr>
</table>
 <table class="t-rev-begin">
<tr class="t-rev t-since-c11"><td>
<p><a href="static_assert.html" title="c/language/ Static assert">static_asserts</a> are considered to be declarations from the point of view of the C grammar (so that they may appear anywhere a declaration may appear), but they do not introduce any identifiers and do not follow the declaration syntax.
</p>
</td>
<td><span class="t-mark-rev t-since-c11">(since C11)</span></td></tr>
</table>
 <table class="t-rev-begin">
<tr class="t-rev t-since-c23"><td>
<p><a href="attributes.html" title="c/language/attributes">Attribute</a> declarations are also considered to be declarations (so that they may appear anywhere a declaration may appear), but they do not introduce any identifiers. A single <code><b>;</b></code> without <span class="t-spar">attr-spec-seq</span> is not an attribute declaration, but a statement.
</p>
</td>
<td><span class="t-mark-rev t-since-c23">(since C23)</span></td></tr>
</table>
<h3><span class="mw-headline" id="References">References</span></h3>
<div class="t-ref-std-17">
<ul><li> C17 standard (ISO/IEC 9899:2018): 
</li></ul>
<dl><dd><ul><li> 6.7 Declarations (p: 78-105)
</li></ul>
</dd></dl>
</div>
<div class="t-ref-std-11">
<ul><li> C11 standard (ISO/IEC 9899:2011): 
</li></ul>
<dl><dd><ul><li> 6.7 Declarations (p: 108-145)
</li></ul>
</dd></dl>
</div>
<div class="t-ref-std-c99">
<ul><li> C99 standard (ISO/IEC 9899:1999): 
</li></ul>
<dl><dd><ul><li> 6.7 Declarations (p: 97-130)
</li></ul>
</dd></dl>
</div>
<div class="t-ref-std-c89">
<ul><li> C89/C90 standard (ISO/IEC 9899:1990): 
</li></ul>
<dl><dd><ul><li> 3.5 Declarations 
</li></ul>
</dd></dl>
</div>
<h3><span class="mw-headline" id="See_also">See also</span></h3>
<table class="t-dsc-begin">

</table>

<!-- 
NewPP limit report
Preprocessor visited node count: 3651/1000000
Preprocessor generated node count: 8328/1000000
Post‐expand include size: 64872/2097152 bytes
Template argument size: 19910/2097152 bytes
Highest expansion depth: 16/40
Expensive parser function count: 0/100
-->

<!-- Saved in parser cache with key mwiki1-mwiki_en_:pcache:idhash:13948-0!*!0!!en!*!* and timestamp 20220313091342 -->
</div>                    <!-- /bodycontent -->
                                        <!-- printfooter -->
                    <div class="printfooter">
                    Retrieved from "<a href="https://en.cppreference.com/mwiki/index.php?title=c/language/declarations&amp;oldid=130617">https://en.cppreference.com/mwiki/index.php?title=c/language/declarations&amp;oldid=130617</a>"                    </div>
                    <!-- /printfooter -->
                                                            <!-- catlinks -->
                    <!-- /catlinks -->
                                                            <div class="visualClear"></div>
                    <!-- debughtml -->
                                        <!-- /debughtml -->
                </div>
                <!-- /bodyContent -->
            </div>
        </div>
        <!-- /content -->
        <!-- footer -->
        <div id="cpp-footer-base" class="noprint">
            <div id="footer">
                        <div id="cpp-navigation">
            <h5>Navigation</h5>
            <ul><li><a href="https://en.cppreference.com/w/c/language/declarations">Online version</a></li><li>Offline version retrieved 2022-07-30 14:05.</li></ul></div>
                        <ul id="footer-info">
                                    <li id="footer-info-lastmod"> This page was last modified on 23 June 2021, at 04:53.</li>
                                    <li id="footer-info-viewcount">This page has been accessed 102,410 times.</li>
                            </ul>
                    </div>
        </div>
        <!-- /footer -->
        <script>if(window.mw){
mw.loader.state({"site":"loading","user":"missing","user.groups":"ready"});
}</script>
<script src="../../../common/skin_scripts.js"></script>
<script>if(window.mw){
mw.loader.load(["mediawiki.action.view.postEdit","mediawiki.user","mediawiki.page.ready","mediawiki.searchSuggest","mediawiki.hidpi","ext.gadget.ColiruCompiler","ext.gadget.MathJax"], null, true);
}</script>
<script src="../../../common/site_scripts.js"></script>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-2828341-1']);
_gaq.push(['_setDomainName', 'cppreference.com']);
_gaq.push(['_trackPageview']);
</script><!-- Served in 0.688 secs. -->
	</body>
<!-- Cached 20220313091342 -->
</html>